package com.operator.Activitys.activity;

import android.graphics.Color;
import android.os.Handler;
import android.support.annotation.NonNull;
import android.view.View;
import android.view.animation.Animation;
import android.view.animation.AnimationUtils;
import android.widget.AdapterView;
import android.widget.GridView;
import android.widget.ImageView;
import android.widget.TextView;

import com.afollestad.materialdialogs.DialogAction;
import com.afollestad.materialdialogs.MaterialDialog;
import com.google.gson.Gson;
import com.operator.Activitys.R;
import com.operator.Activitys.activity.base.BaseActivity;
import com.operator.Activitys.bean.State;
import com.operator.Activitys.bean.User;
import com.operator.Activitys.http.manager.UserManager;
import com.operator.Activitys.utils.Constant;
import com.operator.Activitys.utils.JumperUtils;
import com.operator.Activitys.utils.ToastUtils;
import com.operator.Activitys.view.pay.adapter.KeyBoardAdapter;
import com.operator.Activitys.view.pay.listener.OnPasswordInputFinish;
import com.operator.Activitys.view.pay.widget.PasswordView;
import com.operator.Activitys.view.pay.widget.VirtualKeyboardView;
import com.zhy.autolayout.AutoLinearLayout;
import com.zhy.autolayout.AutoRelativeLayout;

import org.simple.eventbus.EventBus;
import org.simple.eventbus.Subscriber;
import org.simple.eventbus.ThreadMode;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;

import butterknife.Bind;
import butterknife.OnClick;

/**
 * 项目名称：金泽云 手机app
 * 类描述：支付管理
 * 创建人：张飞祥
 * 创建时间：2018/6/14 13:55
 * 修改人：张飞祥
 * 修改时间：2018/6/14 13:55
 * 修改备注：
 */
public class PayManageActivity extends BaseActivity {

    //返回按钮
    @Bind(R.id.iv_return)
    ImageView ivReturn;
    //标题
    @Bind(R.id.tv_title)
    TextView tvTitle;
    //标题总布局
    @Bind(R.id.app_bar_layout)
    AutoRelativeLayout appBarLayout;
    //TODO 店铺有支付密码布局
    @Bind(R.id.layout_pay_yes_pwd)
    AutoLinearLayout layoutPayYesPwd;

    //TODO 店铺无支付密码布局
    @Bind(R.id.layout_pay_no_pwd)
    AutoRelativeLayout layoutPayNoPwd;
    //支付密码标题
    @Bind(R.id.tv_pay_pwd_title)
    TextView tvPayPwdTitle;
    //添加支付密码输入框
    @Bind(R.id.view_pay_pwd_add)
    PasswordView viewPayPwdAdd;
    //确认支付密码输入框
    @Bind(R.id.view_pay_pwd_confirm)
    PasswordView viewPayPwdConfirm;
    //支付安全软件盘
    @Bind(R.id.board_pay_pwd)
    VirtualKeyboardView boardPayPwd;

    //TODO 定义变量
    //内存中用户实体
    protected User mACacheUser = null;
    //软键盘 转换 View
    private GridView gridView;
    //软件盘 输入数据
    private ArrayList<Map<String, String>> valueList;
    //用于记录当前输入密码格位置
    private int currentIndex = -1;
    //获取新建支付密码字段
    private String mPayNewPwd = "";
    //获取确认支付密码字段
    private String mPayNewConfirm = "";

    //支付密码 防止 二次请求
    private boolean mPayHttpFlag = false;

    //TODO 初始化网络请求
    public UserManager mApiManager;

    //软键盘进入动画
    private Animation enterAnim;
    //软键盘退出动画
    private Animation exitAnim;

    @Override
    protected void initUI() {
        setContentView(R.layout.act_pay_manage);
        //网络请求接口 常驻方法
        mApiManager = mApiManager.getUserApiManager(this,this.getTaskId());

        //显示返回按钮
        ivReturn.setVisibility(View.VISIBLE);
        //设置状态栏 背景颜色
        appBarLayout.setBackgroundResource(R.color.color_bg_blue);
        //获取内存用户实体
        Gson gson = new Gson();
        mACacheUser = gson.fromJson(mACache.getAsJSONObject(Constant.CACHE_USER) + "", User.class);
        //将软键盘转换 GridView
        gridView = boardPayPwd.getGridView();

        //软键盘进入动画
        enterAnim = AnimationUtils.loadAnimation(this, R.anim.push_bottom_in);
        //软键盘退出动画
        exitAnim = AnimationUtils.loadAnimation(this, R.anim.push_bottom_out);

        /**
         * 软件盘关闭按钮点击事件
         */
        boardPayPwd.getLayoutBack().setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //设置退出动画
                boardPayPwd.startAnimation(exitAnim);
                //隐藏软键盘
                boardPayPwd.setVisibility(View.GONE);
            }
        });
    }

    @Override
    protected void initData() {
        //判断是否显示 设置支付密码页面
        if (!mACacheUser.getTsPwd().equals("") && mACacheUser.getTsPwd()!=null){
            //隐藏新建支付密码设置页面
            layoutPayNoPwd.setVisibility(View.GONE);
            //显示支付管理页面
            layoutPayYesPwd.setVisibility(View.VISIBLE);
            //设置标题
            tvTitle.setText("支付管理");
        }else{
            //设置标题
            tvTitle.setText("创建支付密码");
            //添加支付密码事件方法
            initPayAdd();
            //显示软键盘
            setShowPayKeyBoard();
        }
    }

    /**
     * 弹出 支付软件盘
     */
    private void setShowPayKeyBoard(){
        //设置进入动画
        boardPayPwd.startAnimation(enterAnim);
        //显示软件盘
        boardPayPwd.setVisibility(View.VISIBLE);
    }

    /**
     * 显示新建 支付密码页面
     */
    private void initPayAdd() {
        //清空数据源
        viewPayPwdAdd.setClearData();
        //显示新建支付密码输入框
        viewPayPwdAdd.setVisibility(View.VISIBLE);
        //隐藏确认支付密码输入框
        viewPayPwdConfirm.setVisibility(View.GONE);
        //更改支付密码 标题 提示
        tvPayPwdTitle.setText(R.string.pay_add_pwd_new);
        //初始化用于记录当前输入密码格位置
        currentIndex = -1;

        //软件盘数据变化 方法
        initValueList();
        //软件盘数据监听
        setBoardOnItemClick(viewPayPwdAdd);

        viewPayPwdAdd.setOnFinishInput(new OnPasswordInputFinish() {
            @Override
            public void inputFinish(String password) {
                //初始化创建密码
                mPayNewPwd = "";
                //获取新建的支付密码
                mPayNewPwd = password;
                //延时0.5s
                new Handler().postDelayed(new Runnable() {
                    @Override
                    public void run() {
                        //调用支付密码输入框页面
                        initPayConfirm();
                    }
                },500);

            }
        });
    }

    /**
     * 显示确认 支付密码页面
     */
    private void initPayConfirm() {
        //清空数据源
        viewPayPwdConfirm.setClearData();
        //隐藏新建支付密码输入框
        viewPayPwdAdd.setVisibility(View.GONE);
        //显示确认支付密码输入框
        viewPayPwdConfirm.setVisibility(View.VISIBLE);
        //更改支付密码 标题 提示
        tvPayPwdTitle.setText(R.string.pay_add_pwd_confirm);
        //初始化用于记录当前输入密码格位置
        currentIndex = -1;

        //软件盘数据变化 方法
        initValueList();
        //软件盘数据监听
        setBoardOnItemClick(viewPayPwdConfirm);

        viewPayPwdConfirm.setOnFinishInput(new OnPasswordInputFinish() {
            @Override
            public void inputFinish(String password) {
                //初始化确认密码
                mPayNewConfirm = "";
                //获取新建的支付密码
                mPayNewConfirm = password;
                //延时0.5s
                new Handler().postDelayed(new Runnable() {
                    @Override
                    public void run() {
                        //TODO 判断两次输入是否一致
                        if (mPayNewConfirm.equals(mPayNewPwd)){
                            //防止重复提交
                            if (!mPayHttpFlag){
                                //显示加载框
                                initShowTimeDialog("正在设置支付密码，请稍后....",PayManageActivity.this);
                                //开始网络请求提交 支付密码
                                mApiManager.userNewTsPwd(mACacheUser.getId(),mPayNewPwd);

                                //设置 flag 为 true
                                mPayHttpFlag = true;
                            }
                        }else{
                            //显示新建密码布局
                            initPayAdd();
                            //弹出提示
                            ToastUtils.showShort(PayManageActivity.this,"两次密码输入不一致，请重新输入！");
                        }
                    }
                },500);

            }
        });
    }

    /**
     *  软件盘数据变化 方法
     *
     *  ps：这里，我们没有使用默认的数字键盘，因为第10个数字不显示.而是空白
     */
    private void initValueList() {

        valueList = new ArrayList<>();
        // 初始化按钮上应该显示的数字
        for (int i = 1; i < 13; i++) {
            Map<String, String> map = new HashMap<String, String>();
            if (i < 10) {
                map.put("name", String.valueOf(i));
            } else if (i == 10) {
                map.put("name", "");
            } else if (i == 11) {
                map.put("name", String.valueOf(0));
            } else if (i == 12) {
                map.put("name", "");
            }
            valueList.add(map);
        }
    }

    /**
     * 软件盘 数据监听 设置 数据到 输入框的 方法
     */
    private void setBoardOnItemClick(final PasswordView pwdView) {

        // 这里、重新为数字键盘gridView设置了Adapter
        KeyBoardAdapter keyBoardAdapter = new KeyBoardAdapter(this, valueList);
        gridView.setAdapter(keyBoardAdapter);
        //开始监听软键盘
        gridView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                if (position < 11 && position != 9) {    //点击0~9按钮

                    if (currentIndex >= -1 && currentIndex < 5) {      //判断输入位置————要小心数组越界
                        ++currentIndex;
                        pwdView.setupView("add",position,currentIndex,valueList.get(position).get("name"));
                    }
                } else {
                    if (position == 11) {      //点击退格键
                        if (currentIndex - 1 >= -1) {      //判断是否删除完毕————要小心数组越界
                            pwdView.setupView("delete",position,currentIndex,valueList.get(position).get("name"));
                            currentIndex--;
                        }
                    }
                }
            }
        });
    }


    /**
     * 网络请求 设置支付密码 报错
     */
    @Subscriber(tag = Constant.BUS_MY_NEW_PAY_PWD_ERROR, mode = ThreadMode.MAIN)
    public void initNewTsPwdError(String httpError) {
        new Handler().postDelayed(new Runnable() {
            @Override
            public void run() {
                //隐藏dialog
                timeDialog.dismiss();
                //提示 dialog
                MaterialDialog mMsgDialog = new MaterialDialog.Builder(PayManageActivity.this)
                        .title("新建失败")
                        .content("可能是当前网络原因，导致新建失败！")
                        .negativeText("直接退出")
                        .negativeColor(Color.parseColor("#cccccc"))
                        .positiveText("重试")
                        .onNegative(new MaterialDialog.SingleButtonCallback() {
                            @Override
                            public void onClick(@NonNull MaterialDialog dialog, @NonNull DialogAction which) {
                                finish();
                            }
                        })
                        .onPositive(new MaterialDialog.SingleButtonCallback() {
                            @Override
                            public void onClick(@NonNull MaterialDialog dialog, @NonNull DialogAction which) {
                                //显示加载框
                                initShowTimeDialog("正在设置支付密码，请稍后....",PayManageActivity.this);
                                //开始网络请求提交 支付密码
                                mApiManager.userNewTsPwd(mACacheUser.getId(),mPayNewPwd);
                            }
                        }).show();
                // 设置点击屏幕Dialog不消失
                mMsgDialog.setCanceledOnTouchOutside(false);
                //取消Back键监听
                mMsgDialog.setCancelable(false);
            }
        }, 1000);
    }

    /**
     * 网络请求 设置支付密码
     */
    @Subscriber(tag = Constant.BUS_MY_NEW_PAY_PWD, mode = ThreadMode.MAIN)
    public void initNewTsPwd(final State state) {
        new Handler().postDelayed(new Runnable() {
            @Override
            public void run() {
                //隐藏dialog
                timeDialog.dismiss();
                //TODO 网络请求业务逻辑判断
                if (state.getState().equals("1")){
                    //保存新的 支付密码
                    mACacheUser.setTsPwd(mPayNewPwd);
                    mACache.put(Constant.CACHE_USER, new Gson().toJson(mACacheUser));

                    //发送设置支付密码 成功
                    EventBus.getDefault().post(mPayNewPwd,Constant.BUS_PAY_SET_UP_PWD_YES);

                    //显示 有支付密码布局
                    layoutPayYesPwd.setVisibility(View.VISIBLE);
                    //隐藏 有支付密码布局
                    layoutPayNoPwd.setVisibility(View.GONE);
                }
                //弹出相应的提示
                ToastUtils.showShort(PayManageActivity.this, state.getMsg());
            }
        }, 1000);
    }


    /**
     * 按钮点击事件
     *
     * @param view
     */
    @OnClick({R.id.iv_return,R.id.layout_pay_pwd, R.id.tv_update_pay_pwd, R.id.tv_forget_pay_pwd})
    public void onClick(View view) {
        switch (view.getId()) {

            case R.id.iv_return:            //返回按钮
                finish();
                break;

            case R.id.layout_pay_pwd:       //支付密码 布局
                setShowPayKeyBoard();
                break;

            case R.id.tv_update_pay_pwd:    //修改支付密码
                JumperUtils.JumpTo(PayManageActivity.this, PayUpdatePwdActivity.class);
                break;

            case R.id.tv_forget_pay_pwd:    //忘记支付密码
                JumperUtils.JumpTo(PayManageActivity.this, PayForgetPwdActivity.class);
                break;
        }
    }
}
